#ifndef humain_hpp
#define humain_hpp

#include "projet.hpp"

using namespace std;

//////////////////HUMAIN/////////////////////////

class humain {
  char * nom;
  string boisson;
  float argent;
  

protected:
  char * copie(const char * c) {
    const char * aux=(c)?c:"";
    char * res = new char[strlen(aux)+1];
    strcpy(res,aux);
    return res;
  }


public :
 
  virtual void action(humain *)=0;
  virtual void donner(float,humain *)=0;
  humain(): nom(copie("")), boisson(""), argent(0) {}
    

  humain(const char * n, float argt, string b) :
    nom(copie(n)), boisson(b), argent(argt){}
 
  virtual ~humain() { delete [] nom;}

  humain(const humain& h) :
    nom(copie(h.nom)), boisson(h.boisson), argent(h.argent) {}

  humain & operator = (const humain &h) {
    if(this != &h) {
      delete [] nom;
      boisson=h.boisson;
      argent=h.argent;
      nom=new char [strlen(h.nom)+1];
      strcpy(nom, h.nom);
    }
    return *this;
  }

  void parler(string s) const
  {

    cout<<"("<<nom<<")"<<" -- "<<s<<endl;

  }

  virtual void dire_bonjour() const
  {
    ostringstream oss; 
    oss<<"Bonjour je m'appelle "<<nom<<", j'aime boire du "<<boisson<<" et j'ai "<<argent<<" euros en poche";
    parler(oss.str());
  }

  void boire() const
  {
    ostringstream oss; 
    oss<<"Mmm un bon verre de "<<boisson<<" Gloups !";
    parler(oss.str());
  }
  
  string get_nom ()const { return nom; }
  
  string get_boisson ()const { return boisson; }
  
  float get_argent()const { return argent; }

  

  void set_boisson(string b){ boisson=b; }

  
  
  void set_argent(float a){ argent=a; }

  void gagner(float argt)
  {
    ostringstream oss;
    argent+=argt;
    oss<<"Trop cool !! J'ai gagné "<<argt<<" d'argent ! Merci! Maintenant je possède "<<argent<<" d'argent.";
    parler(oss.str());
  }

  void perdre(float argt)
  {
    argent-=argt;
    ostringstream oss;
    oss<<"Oh non !! On m'a extorqué tout mon argent !";
    parler(oss.str());}
};

#endif
